#include "connectionPool.hpp"
#include "usermodel.hpp"

/**
 * @brief 操作User对象，将数据插入数据库中
 *
 * @param user
 * @return true
 * @return false
 */
bool UserModel::insert(User &user)
{
    char sql[1024] = {0};
    sprintf(sql, "insert into user(name,password,state) values('%s','%s','%s')", user.getName().c_str(), user.getPwd().c_str(), user.getState().c_str());

    shared_ptr<MySQL> mysql = ConnectionPool::getConnectionPool()->getMySQL();
    if (mysql->update(sql)) // 更新操作
    {
        user.setId(mysql_insert_id(mysql->getConnection()));
        return true;
    }
    return false;
}
/**
 * @brief 通过主键id做查询操作获取行记录
 *
 * @param id 主键id
 * @return User 返回用户-记录的信息
 */
User UserModel::query(int id)
{
    char sql[1024] = {0};
    sprintf(sql, "select * from user where id=%d", id);
    User user;

    shared_ptr<MySQL> mysql = ConnectionPool::getConnectionPool()->getMySQL();
    MYSQL_RES *res = mysql->query(sql);
    if (res != nullptr)
    {
        MYSQL_ROW row = mysql_fetch_row(res);
        if (row != nullptr)
        {
            user.setId(atoi(row[0]));
            user.setName(row[1]);
            user.setPwd(row[2]);
            user.setState(row[3]);
        }
        mysql_free_result(res);
    }
    return user; // 最后return 避免内存泄漏
}
/**
 * @brief 更新用户状态信息到数据库
 *
 * @param user
 * @return true
 * @return false
 */
bool UserModel::updateState(User &user)
{
    char sql[1024] = {0};
    sprintf(sql, "update user set state='%s' where id=%d", user.getState().c_str(), user.getId());

    shared_ptr<MySQL> mysql = ConnectionPool::getConnectionPool()->getMySQL();
    if (mysql->update(sql)) // 更新操作
    {
        return true;
    }
    return false;
}
/**
 * @brief 服务器崩溃-重置数据库中的状态信息
 *
 */
void UserModel::resetState()
{
    char sql[1024] = "update user set state = 'offline' where state='online'";

    shared_ptr<MySQL> mysql = ConnectionPool::getConnectionPool()->getMySQL();
    mysql->update(sql);
}